// Promise是es6新增的一种用于解决异步的方式，解决的是回调函数带来的回调地狱问题
// Promise有三种状态, pending(进行中), fulfilled(已成功), rejected(已失败)。状态改变是不可逆的
// Promise有三种原型方法，和7种实例方法

// const fs = require("fs");

// fs.readFile("./01-js的数据类型.js", "utf-8", (err, data) => {
//   if (err) throw err;
//   console.log(data);
//   fs.readFile("./02-用过es6的哪些新特性.js", "utf-8", (err, data) => {
//     if (err) throw err;
//     console.log(data);
//   });
// });

// const read = (url) => {
//   return new Promise((resolve) => {
//     fs.readFile(url, "utf-8", (err, data) => {
//       if (err) throw err;
//       resolve(data);
//     });
//   });
// };

// read("./01-js的数据类型.js")
//   .then((res) => {
//     console.log(res);
//     return read("./02-用过es6的哪些新特性.js");
//   })
//   .then((res) => {
//     console.log(res);
//   });

// 传入一个数组，是由promise对象组成的数组
// 如果对象里面的promise，每一个都成功了，那么就走.then
// 成功的结果就是每一个成功的结果组成的数组
// 只要有一个失败了就走catch
// 返回的是最先失败的那个的结果
let done = true;
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (done) {
      resolve(1);
    } else {
      reject(2);
    }
  }, 1000);
});
const p2 = new Promise((resolve, reject) => {
  if (!done) {
    resolve(3);
  } else {
    reject(4);
  }
});

Promise.all([p1, p2])
  .then((res) => {
    console.log("success", res);
  })
  .catch((err) => {
    console.log("fail", err);
  });

// 允许你使用原型方法，不能使用.all,封装一个Promise.all()

const all = (arr) => {
  return new Promise((resolve, reject) => {
    // 弄一个计数器
    // 计数器的和arr.length相同了，resolve(成功结果组成的数组)
    // 一旦有一个失败了，reject(当前失败的结果)
  });
};

all([p1, p2]).then();
